package designPattern.singleTonPattern.stp1;
/**
 * 这种单例模式被称为懒汉式单例模式，
 * 因为它是线程不安全的，在并发的情况下，很可能出现多个实例
 * 有三种方式，通过对genInstance方法进行改造，来达到线程
 * 安全
 */
public class SingleTon1 {
	//存在一个私有的构造器，这样外界就不能够通过new的方式创建单例的实例
	private SingleTon1(){
		
	}
	/*
	 * 如果不加static，那么在下面getInstance方法
	 * 是static的，所以就无法直接使用singleTon1，
	 * 所以必须要加上static
	 */
//	private  SingleTon1 singleTon1 = null;
	private static SingleTon1 singleTon1 = null;

	/*
	 * 对外界提供一个静态的获得单例的实例,
	 * 实际上，通过java的反射机制，依然能够实例化构造方法为private
	 * 的类，基本上采用这样的方式，java的单例模式全部都会失效
	 */
	/*
	 * 原始的懒汉方式
	 */
//	public static SingleTon1 getInstance(){
//		if (singleTon1 == null) {
//			singleTon1 = new SingleTon1();
//		}
//		return singleTon1;
//	}
	
	/*
	 * 改造方式1 
	 * 在genInstance方法上面加同步
	 */
//	public static synchronized SingleTon1 getInstance(){
//		if (singleTon1 == null) {
//			singleTon1 = new SingleTon1();
//		}
//		return singleTon1;
//	}
	
	/*
	 * 改造方式2
	 * 双重检查锁定
	 */
//	public static SingleTon1 getInstance(){
//		if (singleTon1==null) {
//			//这个地方是进行线程同步的意思，但是这个涉及到反射机制，留下一个疑问到后面
//			synchronized (SingleTon1.class) {
//				if (singleTon1 == null) {
//					singleTon1 = new SingleTon1();
//				}
//			}
//		}
//		return singleTon1;
//	} 
	
	/*
	 * 改造方式3
	 * 静态内部类
	 * 这种方式，比起上面两种方式，既实现了
	 * 线程安全，又避免了同步带来的性能影响
	 */
	
	private static class LazyHolder{
		private static final SingleTon1 SINGLE_TON1 = new SingleTon1();
	}
	
	public static final SingleTon1 getInstance(){
		return LazyHolder.SINGLE_TON1;
	}
	
}
